package org.example.me.handler;

import lombok.extern.slf4j.Slf4j;
import org.example.me.enums.ExcelTypeEnum;
import org.example.me.handler.template.AbstractCommonExportTemplate;
import org.example.me.handler.context.ExcelContextExtend;
import org.example.me.handler.context.SheetCreator;
import org.example.me.dao.DataGenerator;
import org.example.me.model.User;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 动态表头Excel导出处理器
 * 负责将数据导出为带有动态表头的Excel文件
 */
@Slf4j
@Service
public class DynamicHeadExportHandler extends AbstractCommonExportTemplate {

    /**
     * 获取处理器对应的Excel类型
     * 指定该处理器支持DYNAMIC_HEAD类型的Excel导出
     *
     * @return Excel类型枚举值
     */
    @Override
    public ExcelTypeEnum getExcelType() {
        return ExcelTypeEnum.DYNAMIC_HEAD;
    }

    /**
     * 导出动态表头数据到Excel文件
     * 演示了两种动态表头的实现方式
     *
     * @param excelContext Excel上下文信息
     */
    @Override
    protected void export(ExcelContextExtend excelContext) {
        List<List<String>> head = head();
        // 获取用户数据（实际应用中应该从数据库查询）
        List<User> userList = DataGenerator.generateUserData();
        // userList 对象写法。对象属性从上到下
        SheetCreator build = SheetCreator.builder().sheetName(getExcelType().getSheetName()).head(head).build();

        doWriteData(excelContext, getExcelType().getFileName(), userList, build);
        // List<List<Object>> 写法
        List<List<Object>> data = convert(userList);
        SheetCreator build2 = SheetCreator.builder().sheetName(getExcelType().getSheetName()).head(head).build();
        doWriteData(excelContext, getExcelType().getFileName(), data, build2);
    }

    /**
     * userList 转List<List<Object>>
     *
     * @param userList 用户列表
     * @return List<List<Object>>
     */
    public List<List<Object>> convert(List<User> userList) {
        List<List<Object>> list = new ArrayList<>();
        for (User user : userList) {
            List<Object> list1 = new ArrayList<>();
            list1.add(user.getId());
            list1.add(user.getUsername());
            list1.add(user.getEmail());
            list1.add(user.getCreateTime());
            list.add(list1);
        }
        return list;
    }

    /**
     * 动态表头
     *
     * @return 表头
     */
    public List<List<String>> head() {
        List<List<String>> headList = new ArrayList<>();
        List<String> head0 = new ArrayList<>();
        head0.add("用户ID123");
        headList.add(head0);
        List<String> head1 = new ArrayList<>();
        head1.add("用户名12");
        headList.add(head1);
        List<String> head2 = new ArrayList<>();
        head2.add("邮箱123");
        headList.add(head2);
        List<String> head3 = new ArrayList<>();
        head3.add("创建时间123");
        headList.add(head3);
        return headList;
    }
}